package com.example.d8_homework.homework01;

import java.io.*;

public class Test {
    public static void main(String[] args) {
        // 需求: 编写一个程序, 把一个目录里边的所有带 .java 文件拷贝到另一个目录中,拷贝成功后, 把后缀名是 .java 的文件改为 .txt 文件
        // （注意事项：是先拷贝, 拷贝成功后才可以改后缀名的）
        File srcDir = new File("D:\\File\\temp"); // 源目录
        File destDir = new File("D:\\File\\temp1"); // 目标目录
        copyDirToDir(srcDir, destDir); // 调用方法复制目录
        // 把目标文件夹中的所有 .java 文件改为 .txt
        renameJavaToTxt(destDir); // 调用方法重命名文件
        System.out.println("复制成功"); // 输出复制成功的提示信息
    }

    /**
     * 将目标文件夹中的所有 .java 文件重命名为 .txt 文件
     *
     * @param dir 目标文件夹
     */
    public static void renameJavaToTxt(File dir) {
        File[] files = dir.listFiles(); // 获取文件夹中的所有文件和子文件夹
        if (files == null) {
            return; // 如果文件夹为空,直接返回
        }
        for (File file : files) {
            if (file.isDirectory()) {
                // 递归进入子文件夹
                renameJavaToTxt(file); // 递归调用方法处理子文件夹
            } else {
                String name = file.getName(); // 获取文件名

                // 找到最后一个点出现的位置
                int index = name.lastIndexOf(".");
                String newName = name.substring(0, index) + ".txt"; // 构建新的文件名
                File newFile = new File(dir, newName); // 创建新的文件对象
                file.renameTo(newFile); // 重命名文件
            }
        }
    }

    /**
     * 复制文件夹到文件夹
     *
     * @param srcDir  源文件夹
     * @param destDir 目标文件夹
     */
    public static void copyDirToDir(File srcDir, File destDir) {
        // 1.获取源文件中的所有一级文件对象
        File[] files = srcDir.listFiles(); // 获取源文件夹中的所有文件和子文件夹
        if (files == null) {
            return; // 如果文件夹为空,直接返回
        }

        // 2.遍历一级文件对象
        for (File file : files) {
            // 3.判断这个file是文件还是文件夹
            if (file.isFile()) {
                // 说明是文件
                String name = file.getName();
                // 判断文件名是否以 .java 结尾
                if (name.endsWith(".java")) {
                    // 拷贝文件
                    copyFile(file, destDir); // 调用方法复制文件
                }
            } else {
                // 说明是文件夹,递归进入子文件夹进行查找文件
                File newDestDir = new File(destDir, file.getName()); // 创建目标文件夹中的子文件夹
                if (!newDestDir.exists()) {
                    newDestDir.mkdirs(); // 确保源文件夹中的文件夹在目标文件夹中的源文件夹中存在
                }
                copyDirToDir(file, newDestDir); // 递归调用方法处理子文件夹
            }
        }
    }

    /**
     * 复制文件到文件夹
     *
     * @param srcFile 源文件
     * @param destDir 目标文件夹
     */
    private static void copyFile(File srcFile, File destDir) {
        // 创建目标文件对象
        File destFile = new File(destDir, srcFile.getName());
        try (
                Reader r = new FileReader(srcFile);
                BufferedReader br = new BufferedReader(r);

                Writer w = new FileWriter(destFile);
                BufferedWriter bw = new BufferedWriter(w);
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常堆栈信息
        }
    }
}
